#include "eui64.h"
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>

in6_addr eui64(const ether_addr mac) {
    in6_addr res = {0};
    // 样例 1 的输入仅有一个 MAC 地址：11:22:33:44:55:66，按照要求的算法进行处理：
    // 1. 设置 IPv6 地址的前 8 个字节
    // 得到 fe80:0000:0000:0000:0000:0000:0000:0000
    res.s6_addr[0] = 0xfe;
    res.s6_addr[1] = 0x80;
    const uint8_t *mac_bytes = mac.ether_addr_octet;
    // 2. 把 MAC 地址分为两部分填入
    // 得到 fe80:0000:0000:0000:1122:3300:0044:5566
    res.s6_addr[15] = mac_bytes[5];
    res.s6_addr[14] = mac_bytes[4];
    res.s6_addr[13] = mac_bytes[3];
    res.s6_addr[10] = mac_bytes[2];
    res.s6_addr[9] = mac_bytes[1];
    res.s6_addr[8] = mac_bytes[0];
    // 3. 填入中间的空位
    // 得到 fe80:0000:0000:0000:1122:33ff:fe44:5566
    res.s6_addr[12] = 0xfe;
    res.s6_addr[11] = 0xff;
    // 4. 将 11 的从低到高的第2位取反，即 13，得到
    // fe80:0000:0000:0000:1322:33ff:fe44:5566
    res.s6_addr[8] ^= 0b10;

    // 如果采用inet_ntop函数输出 IPv6 地址，连续的零省略为 ::，
    // 得到最终结果 fe80::1322:33ff:fe44:5566。
    return res;
}